summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFernando S <fsahmkow27@gmail.com>2022-11-30 16:41:32 +0100
committerGitHub <noreply@github.com>2022-11-30 16:41:32 +0100
commit4e89979c87dfa77f0c55b03a5aaf00706276c2f0 (patch)
tree50fcec585d4b33e0d2a3ed6e25d40d1c3bf19370
parentMerge pull request #9349 from lat9nq/cmake-322 (diff)
parentaudio_core: sink_stream: Hold the suspend lock when process is stalled. (diff)
downloadyuzu-4e89979c87dfa77f0c55b03a5aaf00706276c2f0.tar
yuzu-4e89979c87dfa77f0c55b03a5aaf00706276c2f0.tar.gz
yuzu-4e89979c87dfa77f0c55b03a5aaf00706276c2f0.tar.bz2
yuzu-4e89979c87dfa77f0c55b03a5aaf00706276c2f0.tar.lz
yuzu-4e89979c87dfa77f0c55b03a5aaf00706276c2f0.tar.xz
yuzu-4e89979c87dfa77f0c55b03a5aaf00706276c2f0.tar.zst
yuzu-4e89979c87dfa77f0c55b03a5aaf00706276c2f0.zip
-rw-r--r--src/audio_core/sink/sink_stream.cpp11
-rw-r--r--src/audio_core/sink/sink_stream.h5
-rw-r--r--src/core/core.cpp11
3 files changed, 14 insertions, 13 deletions
diff --git a/src/audio_core/sink/sink_stream.cpp b/src/audio_core/sink/sink_stream.cpp
index 849f862b0..67e194e3c 100644
--- a/src/audio_core/sink/sink_stream.cpp
+++ b/src/audio_core/sink/sink_stream.cpp
@@ -266,19 +266,20 @@ void SinkStream::ProcessAudioOutAndRender(std::span<s16> output_buffer, std::siz
}
void SinkStream::Stall() {
- if (stalled) {
+ std::scoped_lock lk{stall_guard};
+ if (stalled_lock) {
return;
}
- stalled = true;
- system.StallProcesses();
+ stalled_lock = system.StallProcesses();
}
void SinkStream::Unstall() {
- if (!stalled) {
+ std::scoped_lock lk{stall_guard};
+ if (!stalled_lock) {
return;
}
system.UnstallProcesses();
- stalled = false;
+ stalled_lock.unlock();
}
} // namespace AudioCore::Sink
diff --git a/src/audio_core/sink/sink_stream.h b/src/audio_core/sink/sink_stream.h
index 38a4b2f51..5fea72ab7 100644
--- a/src/audio_core/sink/sink_stream.h
+++ b/src/audio_core/sink/sink_stream.h
@@ -6,6 +6,7 @@
#include <array>
#include <atomic>
#include <memory>
+#include <mutex>
#include <span>
#include <vector>
@@ -240,8 +241,8 @@ private:
f32 system_volume{1.0f};
/// Set via IAudioDevice service calls
f32 device_volume{1.0f};
- /// True if coretiming has been stalled
- bool stalled{false};
+ std::mutex stall_guard;
+ std::unique_lock<std::mutex> stalled_lock;
};
using SinkStreamPtr = std::unique_ptr<SinkStream>;
diff --git a/src/core/core.cpp b/src/core/core.cpp
index d8934be52..94d4e2212 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -189,7 +189,7 @@ struct System::Impl {
kernel.Suspend(false);
core_timing.SyncPause(false);
- is_paused = false;
+ is_paused.store(false, std::memory_order_relaxed);
return status;
}
@@ -200,14 +200,13 @@ struct System::Impl {
core_timing.SyncPause(true);
kernel.Suspend(true);
- is_paused = true;
+ is_paused.store(true, std::memory_order_relaxed);
return status;
}
bool IsPaused() const {
- std::unique_lock lk(suspend_guard);
- return is_paused;
+ return is_paused.load(std::memory_order_relaxed);
}
std::unique_lock<std::mutex> StallProcesses() {
@@ -218,7 +217,7 @@ struct System::Impl {
}
void UnstallProcesses() {
- if (!is_paused) {
+ if (!IsPaused()) {
core_timing.SyncPause(false);
kernel.Suspend(false);
}
@@ -465,7 +464,7 @@ struct System::Impl {
}
mutable std::mutex suspend_guard;
- bool is_paused{};
+ std::atomic_bool is_paused{};
std::atomic<bool> is_shutting_down{};
Timing::CoreTiming core_timing;